{
 "metadata": {
  "name": "PyQuante Testing"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "# Development of PyQuante 2\nRick Muller, rpmuller@gmail.com\n\nI've been working on a rewrite of the PyQuante code, trying to get a more intuitive module structure and cleaner bindings of routines. The attached has some timing and other test results playing with the code. This isn't really meant as documentation or a gallery of pyquante2 features, but you can see some of them here.\n\nYou can fork the code from the [pyquante2 github site](https://github.com/rpmuller/pyquante2).\n\n## What's new?\nThere are more modules, and the source code is spread between multiple directories. However, the goal is to have all generally-used modules imported from the main top-level module:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import rhf,h2,h2o,c6h6,basisset",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Many modules have special printing functions to support IPython:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "h2o",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": "<html><p><h2>Water</h2><p>Stoichiometry = H2O, Charge = 0, Multiplicity = 1</p><table><tr><th>#</th><th>Atno</th><th>Symbol</th><th>x</th><th>y</th><th>z</th></tr><tr><td>0</td><td>8</td><td>O</td><td>0.00000</td><td>0.00000</td><td>0.09169</td></tr><tr><td>1</td><td>1</td><td>H</td><td>1.42296</td><td>0.00000</td><td>-0.98120</td></tr><tr><td>2</td><td>1</td><td>H</td><td>-1.42296</td><td>0.00000</td><td>-0.98120</td></tr></table></p></html>",
       "output_type": "pyout",
       "prompt_number": 2,
       "text": "Stoichiometry = H2O, Charge = 0, Multiplicity = 1\n8 O     0.000000     0.000000     0.091685\n1 H     1.422960     0.000000    -0.981204\n1 H    -1.422960     0.000000    -0.981204"
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "c6h6",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": "<html><p><h2>Benzene</h2><p>Stoichiometry = H6C6, Charge = 0, Multiplicity = 1</p><table><tr><th>#</th><th>Atno</th><th>Symbol</th><th>x</th><th>y</th><th>z</th></tr><tr><td>0</td><td>6</td><td>C</td><td>1.86582</td><td>1.86582</td><td>0.00000</td></tr><tr><td>1</td><td>6</td><td>C</td><td>2.54875</td><td>-0.68294</td><td>0.00000</td></tr><tr><td>2</td><td>6</td><td>C</td><td>0.68294</td><td>-2.54875</td><td>0.00000</td></tr><tr><td>3</td><td>6</td><td>C</td><td>-1.86582</td><td>-1.86582</td><td>0.00000</td></tr><tr><td>4</td><td>6</td><td>C</td><td>-2.54875</td><td>0.68294</td><td>0.00000</td></tr><tr><td>5</td><td>6</td><td>C</td><td>-0.68294</td><td>2.54875</td><td>0.00000</td></tr><tr><td>6</td><td>1</td><td>H</td><td>3.31743</td><td>3.31743</td><td>0.00000</td></tr><tr><td>7</td><td>1</td><td>H</td><td>4.53169</td><td>-1.21426</td><td>0.00000</td></tr><tr><td>8</td><td>1</td><td>H</td><td>1.21426</td><td>-4.53169</td><td>0.00000</td></tr><tr><td>9</td><td>1</td><td>H</td><td>-3.31743</td><td>-3.31743</td><td>0.00000</td></tr><tr><td>10</td><td>1</td><td>H</td><td>-4.53169</td><td>1.21426</td><td>0.00000</td></tr><tr><td>11</td><td>1</td><td>H</td><td>-1.21426</td><td>4.53169</td><td>0.00000</td></tr></table></p></html>",
       "output_type": "pyout",
       "prompt_number": 3,
       "text": "Stoichiometry = H6C6, Charge = 0, Multiplicity = 1\n6 C     1.865817     1.865817     0.000000\n6 C     2.548754    -0.682937     0.000000\n6 C     0.682937    -2.548754     0.000000\n6 C    -1.865817    -1.865817     0.000000\n6 C    -2.548754     0.682937     0.000000\n6 C    -0.682937     2.548754     0.000000\n1 H     3.317430     3.317430     0.000000\n1 H     4.531693    -1.214264     0.000000\n1 H     1.214264    -4.531693     0.000000\n1 H    -3.317430    -3.317430     0.000000\n1 H    -4.531693     1.214264     0.000000\n1 H    -1.214264     4.531693     0.000000"
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "We also try to have decent printing for those objects:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "print c6h6",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "Stoichiometry = H6C6, Charge = 0, Multiplicity = 1\n6 C     1.865817     1.865817     0.000000\n6 C     2.548754    -0.682937     0.000000\n6 C     0.682937    -2.548754     0.000000\n6 C    -1.865817    -1.865817     0.000000\n6 C    -2.548754     0.682937     0.000000\n6 C    -0.682937     2.548754     0.000000\n1 H     3.317430     3.317430     0.000000\n1 H     4.531693    -1.214264     0.000000\n1 H     1.214264    -4.531693     0.000000\n1 H    -3.317430    -3.317430     0.000000\n1 H    -4.531693     1.214264     0.000000\n1 H    -1.214264     4.531693     0.000000\n"
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "The solvers have decent printing as well:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "h2",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": "<html><p><h2>Hydrogen</h2><p>Stoichiometry = H2, Charge = 0, Multiplicity = 1</p><table><tr><th>#</th><th>Atno</th><th>Symbol</th><th>x</th><th>y</th><th>z</th></tr><tr><td>0</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>0.69218</td></tr><tr><td>1</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>-0.69218</td></tr></table></p></html>",
       "output_type": "pyout",
       "prompt_number": 5,
       "text": "Stoichiometry = H2, Charge = 0, Multiplicity = 1\n1 H     0.000000     0.000000     0.692176\n1 H     0.000000     0.000000    -0.692176"
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "bfs = basisset(h2)\nbfs",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 6,
       "text": "cgbf((0.0, 0.0, 0.69217561132317929),(0, 0, 0),[3.42525091, 0.62391373, 0.1688554],[0.1543289707029839, 0.5353281424384733, 0.44463454202535485])\ncgbf((0.0, 0.0, -0.69217561132317929),(0, 0, 0),[3.42525091, 0.62391373, 0.1688554],[0.1543289707029839, 0.5353281424384733, 0.44463454202535485])"
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "solver = rhf(h2,bfs)\nsolver",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": "<html><h2>RHF Hamiltonian</h2><p><h2>Hydrogen</h2><p>Stoichiometry = H2, Charge = 0, Multiplicity = 1</p><table><tr><th>#</th><th>Atno</th><th>Symbol</th><th>x</th><th>y</th><th>z</th></tr><tr><td>0</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>0.69218</td></tr><tr><td>1</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>-0.69218</td></tr></table></p><p>Basis set: sto3g, Nbf: 2</p><p>Status: Converged=False</p></html>",
       "output_type": "pyout",
       "prompt_number": 7,
       "text": "RHF Hamiltonian\nStoichiometry = H2, Charge = 0, Multiplicity = 1\n1 H     0.000000     0.000000     0.692176\n1 H     0.000000     0.000000    -0.692176\nBasis set: sto3g, Nbf: 2\nStatus: Converged = False"
      }
     ],
     "prompt_number": 7
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "solver.converge()\nsolver",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": "<html><h2>RHF Hamiltonian</h2><p><h2>Hydrogen</h2><p>Stoichiometry = H2, Charge = 0, Multiplicity = 1</p><table><tr><th>#</th><th>Atno</th><th>Symbol</th><th>x</th><th>y</th><th>z</th></tr><tr><td>0</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>0.69218</td></tr><tr><td>1</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>-0.69218</td></tr></table></p><p>Basis set: sto3g, Nbf: 2</p><p>Status: Converged=True</p><table><tr><th>#</th><th>Energy</th></tr><tr /><td>0</td><td>0.48556</td><tr /><td>1</td><td>-1.11710</td></table></html>",
       "output_type": "pyout",
       "prompt_number": 8,
       "text": "RHF Hamiltonian\nStoichiometry = H2, Charge = 0, Multiplicity = 1\n1 H     0.000000     0.000000     0.692176\n1 H     0.000000     0.000000    -0.692176\nBasis set: sto3g, Nbf: 2\nStatus: Converged = True\n0  0.48556\n1  -1.11710"
      }
     ],
     "prompt_number": 8
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "print solver",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "RHF Hamiltonian\nStoichiometry = H2, Charge = 0, Multiplicity = 1\n1 H     0.000000     0.000000     0.692176\n1 H     0.000000     0.000000    -0.692176\nBasis set: sto3g, Nbf: 2\nStatus: Converged = True\n0  0.48556\n1  -1.11710\n"
      }
     ],
     "prompt_number": 9
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Simple orbital printing is built it:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import lineplot_orbs,contourplot,line",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 10
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "points = line((0,0,-5),(0,0,5))\nlineplot_orbs(points,solver.orbs[:,:2],bfs,\n    title=\"Plots of bonding and antibonding orbitals of H2\")",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "display_data",
       "png": "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\n"
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "contourplot('yz',h2,solver.orbs[:,1],bfs,\n    title=\"Contours of H2 antibonding orbital\")",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "display_data",
       "png": "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\ngg==\n"
      }
     ],
     "prompt_number": 12
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "## Iterators and convergence\nThe iterator throws an exception if convergence isn't achieved:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "solver = rhf(h2,basisset(h2))",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 13
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "solver",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": "<html><h2>RHF Hamiltonian</h2><p><h2>Hydrogen</h2><p>Stoichiometry = H2, Charge = 0, Multiplicity = 1</p><table><tr><th>#</th><th>Atno</th><th>Symbol</th><th>x</th><th>y</th><th>z</th></tr><tr><td>0</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>0.69218</td></tr><tr><td>1</td><td>1</td><td>H</td><td>0.00000</td><td>0.00000</td><td>-0.69218</td></tr></table></p><p>Basis set: sto3g, Nbf: 2</p><p>Status: Converged=False</p></html>",
       "output_type": "pyout",
       "prompt_number": 14,
       "text": "RHF Hamiltonian\nStoichiometry = H2, Charge = 0, Multiplicity = 1\n1 H     0.000000     0.000000     0.692176\n1 H     0.000000     0.000000    -0.692176\nBasis set: sto3g, Nbf: 2\nStatus: Converged = False"
      }
     ],
     "prompt_number": 14
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "solver.converge(maxiters=1)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 15,
       "text": "[0.48556025168474959]"
      }
     ],
     "prompt_number": 15
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "solver.energies",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 16,
       "text": "[0.48556025168474959]"
      }
     ],
     "prompt_number": 16
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "## Comparing timings and results with v1"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "import PyQuante, pyquante2",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 17
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Tests in the utils unit tests:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "print map(PyQuante.pyints.fact2,[0,1,3,8,-1]), map(pyquante2.utils.fact2,[0,1,3,8,-1])\nfor a,b in [(5,2),(10,5)]:\n    print PyQuante.pyints.binomial(a,b),pyquante2.utils.binomial(a,b)\nprint PyQuante.pyints.Fgamma(0,0),pyquante2.utils.Fgamma(0,0)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "[1, 1, 3, 384, 1] [1, 1, 3, 384, 1]\n10 10\n252 252\n0.999999996667 1.0\n"
      }
     ],
     "prompt_number": 18
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "## Test one-e integrals and pgbfs\nTests in the one.py unit tests:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "s1 = PyQuante.PGBF.PGBF(1,(0.,0.,0.))\ns2 = pyquante2.pgbf(1)\nprint s1.overlap(s1),pyquante2.S(s2,s2)\nprint s1.kinetic(s1),pyquante2.T(s2,s2)\nprint s1.nuclear(s1,(0,0,0)),pyquante2.V(s2,s2,(0,0,0))",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1.0 1.0\n1.5 1.5\n-1.59576911629 -1.59576912161\n"
      }
     ],
     "prompt_number": 19
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Confused about the incomplete gamma function at small values. It would be nice to be able to use the scipy routines as a replacement, but they don't seem to give the same results across the board."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2.utils import *\nfrom math import gamma\nfrom scipy.special import gammainc\nfor x in [0.1,2,3,4]:\n    print gamma(x),gammainc(x,1e-10),gammainc(x,1e10),gamm_inc(x,1e-10),gamm_inc(x,1e10)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "9.51350769867 0.10511370061 1.0 0.999999999991 9.51350769867\n1.0 4.99999999967e-21 1.0 4.99999999967e-21 1.0\n2.0 1.66666666654e-31 1.0 3.33333333308e-31 2.0\n6.0 4.16666666633e-42 1.0 2.4999999998e-41 6.0\n"
      }
     ],
     "prompt_number": 20
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "This doesn't make any sense.\n\n## Test cgbfs with one-e integrals:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from PyQuante.CGBF import CGBF\nfrom pyquante2 import cgbf,S,T\nc1 = CGBF((0,0,0),(0,0,0))\nc1b = CGBF((0,0,1.0),(0,0,0))\nexps,coefs = [],[]\nfor ex,co in [(3.4252509099999999, 0.15432897000000001),\n           (0.62391373000000006, 0.53532813999999995),\n           (0.16885539999999999, 0.44463454000000002)]:\n    exps.append(ex)\n    coefs.append(co)\n    c1.add_primitive(ex,co)\n    c1b.add_primitive(ex,co)\nc1.normalize()\nc1b.normalize()\n\nc2 = cgbf(exps=exps,coefs=coefs)\nc2b = cgbf((0,0,1.0),exps=exps,coefs=coefs)\n\nprint \"Overlaps\"\nprint c1.overlap(c1), S(c2,c2)\nprint c1.overlap(c1b), S(c2,c2b)\n\nprint \"Kinetics\"\nprint c1.kinetic(c1), T(c2,c2)\nprint c1.kinetic(c1b), T(c2,c2b)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "Overlaps\n1.0 1.0\n0.796588300697 0.796588300697\nKinetics\n0.760031883567 0.760031883567\n0.383253671655 0.383253671655\n"
      }
     ],
     "prompt_number": 21
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "# Integral routines and timing:\n\n## Timing top level ERI routines"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "s = pyquante2.pgbf(1)\nfrom pyquante2.ints import two,hgp\n%timeit two.ERI(s,s,s,s)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1000 loops, best of 3: 347 us per loop\n"
      }
     ],
     "prompt_number": 22
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit hgp.ERI_hgp(s,s,s,s)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1000 loops, best of 3: 238 us per loop\n"
      }
     ],
     "prompt_number": 23
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import ctwo\n%timeit ctwo.ERI(s,s,s,s)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "100000 loops, best of 3: 6.54 us per loop\n"
      }
     ],
     "prompt_number": 24
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit ctwo.ERI_hgp(s,s,s,s)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "100000 loops, best of 3: 4.98 us per loop\n"
      }
     ],
     "prompt_number": 25
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Nice speedup from Cython, but I had expected more relative speedup between hgp and the normal code. First run of this (little cython optimization) gave 4.4 us from ERI, and 3.84 from hgp. Python was 162 us."
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "## Timing comparison for different vrr routines:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2.ctwo import ERI,ERI_hgp,vrr,vrr_recursive,vrr_nonrecursive\nfrom pyquante2.ints.hgp import vrr as pyvrr",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 26
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "zero = array([0,0,0],'d')\n%timeit pyvrr(zero,1.,(0,0,0),1.,zero,1.,1., zero,1.,(0,0,0),1.,zero,1.,1.,0)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1000 loops, best of 3: 214 us per loop\n"
      }
     ],
     "prompt_number": 27
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit vrr(0,0,0,1.,0,0,0,1.,0,0,0,1.,1.,0,0,0,1.,0,0,0,1.,0,0,0,1.,1.,0)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1000000 loops, best of 3: 1.67 us per loop\n"
      }
     ],
     "prompt_number": 28
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit vrr_recursive(0,0,0,1.,0,0,0,1.,0,0,0,1.,1.,0,0,0,1.,0,0,0,1.,0,0,0,1.,1.,0)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1000000 loops, best of 3: 1.87 us per loop\n"
      }
     ],
     "prompt_number": 29
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit vrr_nonrecursive(0,0,0,1.,0,0,0,1.,0,0,0,1.,1.,0,0,0,1.,0,0,0,1.,0,0,0,1.,1.,0)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "1000000 loops, best of 3: 1.92 us per loop\n"
      }
     ],
     "prompt_number": 30
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Again, first time through I had expected more differences between the versions. The python version is 150 us, vrr was 1.21, and vrr_recursive was 1.26. For the added complexity of vrr (storing intermediate quantities) it almost seems worth it to go back to the recursive version.\n\nvrr is now set to the recursive version. I can remove the nonrecursive version if needed."
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "## Comparison of old and new ERI code:\n\nPGBF code:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from PyQuante.PGBF import coulomb\nfrom pyquante2.ctwo import ERI_hgp, ERI\n\ns1 = PyQuante.PGBF.PGBF(1,(0.,0.,0.))\ns2 = pyquante2.pgbf(1)\n\ns1b = PyQuante.PGBF.PGBF(1,(0.,0.,1.))\ns2b = pyquante2.pgbf(1,(0,0,1))\n\n%timeit coulomb(s1,s1,s1,s1)\n%timeit ERI_hgp(s2,s2,s2,s2)\nprint coulomb(s1,s1,s1,s1), ERI_hgp(s2,s2,s2,s2)\nprint coulomb(s1,s1,s1b,s1b), ERI_hgp(s2,s2,s2b,s2b), ERI(s2,s2,s2b,s2b)\nprint coulomb(s1,s1b,s1,s1b), ERI_hgp(s2,s2b,s2,s2b), ERI(s2,s2b,s2,s2b)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "100000 loops, best of 3: 5.22 us per loop\n100000 loops, best of 3: 6.05 us per loop"
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "\n1.12837916333 1.12837916333\n0.842700790029 0.842700790029 0.842700790029\n0.415107496037 0.415107496037 0.415107496037\n"
      }
     ],
     "prompt_number": 31
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "The new routines run at the same speed, which isn't altogether surprising, but it's nice to know I haven't lost anything due to the Cython wrappers.\n\nCGBF code:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from PyQuante.CGBF import CGBF,coulomb\nfrom pyquante2 import cgbf\nfrom pyquante2.ctwo import ERI_hgp\n\nc1 = CGBF((0,0,0),(0,0,0))\nc1b = CGBF((0,0,1.0),(0,0,0))\nexps,coefs = [],[]\nfor ex,co in [(3.4252509099999999, 0.15432897000000001),\n           (0.62391373000000006, 0.53532813999999995),\n           (0.16885539999999999, 0.44463454000000002)]:\n    exps.append(ex)\n    coefs.append(co)\n    c1.add_primitive(ex,co)\n    c1b.add_primitive(ex,co)\nc1.normalize()\nc1b.normalize()\n\nc2 = cgbf(exps=exps,coefs=coefs)\nc2b = cgbf((0,0,1.0),exps=exps,coefs=coefs)\n\n%timeit coulomb(c1,c1,c1,c1)\n%timeit ERI_hgp(c2,c2,c2,c2)\n%timeit ERI(c2,c2,c2,c2)\nprint coulomb(c1,c1,c1,c1), ERI_hgp(c2,c2,c2,c2)\nprint coulomb(c1,c1,c1b,c1b), ERI_hgp(c2,c2,c2b,c2b)\nprint coulomb(c1,c1b,c1,c1b), ERI_hgp(c2,c2b,c2,c2b)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "10000 loops, best of 3: 49.4 us per loop\n10000 loops, best of 3: 41.4 us per loop"
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "\n1000 loops, best of 3: 1.22 ms per loop"
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "\n0.774605941338 0.774605941338\n0.650177460815 0.650177460815\n0.455901518744 0.455901518744\n"
      }
     ],
     "prompt_number": 32
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "# SCF examples:\n\n## LiH, STO-3G"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from PyQuante.Ints import getbasis,getints,getT,getV\nfrom PyQuante.hartree_fock import rhf\nfrom PyQuante.Molecule import Molecule\n\nLiH = Molecule('lih',\n                 [(3,( .0000000000, .0000000000, .0000000000)),\n                  (1,( .0000000000, .0000000000,1.629912))],\n                 units='Angstroms')\nbfs = getbasis(LiH,'sto-3g')\nnbf = len(bfs)\nnocc,nopen = LiH.get_closedopen()\nassert nopen==0\nS,h,Ints = getints(bfs,LiH)\nen,orbe,orbs = rhf(LiH,integrals=(S,h,Ints),verbose=True)\nprint \"SCF completed, E = \",en \nprint \"S = \\n\",S\nprint \"h = \\n\",h\nprint \"I2 = \\n\",Ints[:5]",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "SCF completed, E =  -7.86073576968\nS = \n[[ 1.          0.24113665  0.          0.          0.          0.06239818]\n [ 0.24113665  1.          0.          0.          0.          0.38780341]\n [ 0.          0.          1.          0.          0.          0.        ]\n [ 0.          0.          0.          1.          0.          0.        ]\n [ 0.          0.          0.          0.          1.          0.50716955]\n [ 0.06239818  0.38780341  0.          0.          0.50716955  1.        ]]\nh = \n[[-4.73076107 -1.06286658  0.          0.         -0.01551519 -0.28307001]\n [-1.06286658 -1.39257572  0.          0.         -0.12049949 -0.67475424]\n [ 0.          0.         -1.13302238  0.          0.          0.        ]\n [ 0.          0.          0.         -1.13302238  0.          0.        ]\n [-0.01551519 -0.12049949  0.          0.         -1.22977649 -0.82314252]\n [-0.28307001 -0.67475424  0.          0.         -0.82314252 -1.43835583]]\nI2 = \narray('d', [1.6803951639324308, 0.26542036372307215, 0.049941457073764725, 0.39772685976397343, 0.09286014333241713])\n"
      }
     ],
     "prompt_number": 33
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from PyQuante.TestMolecules import h2o\nbfs = getbasis(h2o,'sto-3g')\nnbf = len(bfs)\nS,h,Ints = getints(bfs,h2o)\nen,orbe,orbs = rhf(h2o,integrals=(S,h,Ints),verbose=True)\nprint \"SCF completed, E = \",en \nprint \"S = \\n\",S\nprint \"h = \\n\",h\nprint \"I2 = \\n\",Ints[:5]\n",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "SCF completed, E =  -74.9598407887\nS = \n[[  1.00000000e+00   2.36703937e-01   0.00000000e+00   0.00000000e+00\n   -3.95628520e-18   5.58181517e-02   5.58181517e-02]\n [  2.36703937e-01   1.00000000e+00   0.00000000e+00   0.00000000e+00\n   -6.93671951e-18   4.84133479e-01   4.84133479e-01]\n [  0.00000000e+00   0.00000000e+00   1.00000000e+00   0.00000000e+00\n    0.00000000e+00   3.18049483e-01  -3.18049483e-01]\n [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.00000000e+00\n    0.00000000e+00   0.00000000e+00   0.00000000e+00]\n [ -3.95628520e-18  -6.93671951e-18   0.00000000e+00   0.00000000e+00\n    1.00000000e+00  -2.39804296e-01  -2.39804296e-01]\n [  5.58181517e-02   4.84133479e-01   3.18049483e-01   0.00000000e+00\n   -2.39804296e-01   1.00000000e+00   2.54586613e-01]\n [  5.58181517e-02   4.84133479e-01  -3.18049483e-01   0.00000000e+00\n   -2.39804296e-01   2.54586613e-01   1.00000000e+00]]\nh = \n[[ -3.27375153e+01  -7.61673386e+00   0.00000000e+00   0.00000000e+00\n    1.92563167e-02  -1.81001390e+00  -1.81001390e+00]\n [ -7.61673386e+00  -9.34981296e+00   0.00000000e+00   0.00000000e+00\n    2.25272914e-01  -3.83196154e+00  -3.83196154e+00]\n [  0.00000000e+00   0.00000000e+00  -7.63461067e+00   0.00000000e+00\n    0.00000000e+00  -2.08476894e+00   2.08476894e+00]\n [  0.00000000e+00   0.00000000e+00   0.00000000e+00  -7.46989436e+00\n    0.00000000e+00   0.00000000e+00   0.00000000e+00]\n [  1.92563167e-02   2.25272914e-01   0.00000000e+00   0.00000000e+00\n   -7.56353430e+00   1.64578178e+00   1.64578178e+00]\n [ -1.81001390e+00  -3.83196154e+00  -2.08476894e+00   0.00000000e+00\n    1.64578178e+00  -5.13309366e+00  -1.64475717e+00]\n [ -1.81001390e+00  -3.83196154e+00   2.08476894e+00   0.00000000e+00\n    1.64578178e+00  -1.64475717e+00  -5.13309366e+00]]\nI2 = \narray('d', [4.785065388755281, 0.7413803495021389, 0.13687338489814346, 1.1189468626126458, 0.2566333938755287])\n"
      }
     ],
     "prompt_number": 34
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import molecule,lih,basisset,rhf\nfrom pyquante2.ints.integrals import onee_integrals,twoe_integrals\nfrom pyquante2.utils import dmat,trace2,geigh\n\nlih = molecule([\n    (3,.0000000000, .0000000000, .0000000000),\n    (1, .0000000000, .0000000000,1.629912)],\n    units='Angstroms')\n\nbfs = basisset(lih,'sto3g')\n\ni1 = onee_integrals(bfs,lih)\ni2 = twoe_integrals(bfs)\nprint \"S = \\n\",i1.S\nprint \"h = \\n\",i1.T + i1.V\nprint \"I2 = \\n\",i2._2e_ints[:5]\ns = rhf(lih,bfs)\ns.converge()",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "S = \n[[ 1.          0.24113665  0.          0.          0.          0.06239931]\n [ 0.24113665  1.          0.          0.          0.          0.38780552]\n [ 0.          0.          1.          0.          0.          0.        ]\n [ 0.          0.          0.          1.          0.          0.        ]\n [ 0.          0.          0.          0.          1.          0.50717121]\n [ 0.06239931  0.38780552  0.          0.          0.50717121  1.        ]]\nh = \n[[-4.73076276 -1.06286698  0.          0.         -0.01551535 -0.28307525]\n [-1.06286698 -1.39257664  0.          0.         -0.12049997 -0.67475941]\n [ 0.          0.         -1.13302317  0.          0.          0.        ]\n [ 0.          0.          0.         -1.13302317  0.          0.        ]\n [-0.01551535 -0.12049997  0.          0.         -1.22977768 -0.82314683]\n [-0.28307525 -0.67475941  0.          0.         -0.82314683 -1.4383608 ]]\nI2 = \n[[[[  1.68039516e+00   2.65420364e-01   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   6.67460269e-02]\n   [  2.65420364e-01   3.97726860e-01   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.45977260e-01]\n   [  0.00000000e+00   0.00000000e+00   3.96639641e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   3.96639641e-01\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      3.96639641e-01   1.77730867e-01]\n   [  6.67460269e-02   1.45977260e-01   0.00000000e+00   0.00000000e+00\n      1.77730867e-01   3.23596627e-01]]\n\n  [[  2.65420364e-01   4.99414571e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.26228730e-02]\n   [  4.99414571e-02   9.28601433e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   3.44386672e-02]\n   [  0.00000000e+00   0.00000000e+00   9.28803966e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   9.28803966e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      9.28803966e-02   4.23962450e-02]\n   [  1.26228730e-02   3.44386672e-02   0.00000000e+00   0.00000000e+00\n      4.23962450e-02   7.77132412e-02]]\n\n  [[  0.00000000e+00   0.00000000e+00   8.98131923e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.37882688e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  8.98131923e-03   1.37882688e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.86733880e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   2.86733880e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   8.98131923e-03\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.37882688e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  8.98131923e-03   1.37882688e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.86733880e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.86733880e-03\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      8.98131923e-03   1.49253636e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.37882688e-02   5.61064034e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  8.98131923e-03   1.37882688e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   8.72195152e-03]\n   [  1.49253636e-03   5.61064034e-03   0.00000000e+00   0.00000000e+00\n      8.72195152e-03   1.47614365e-02]]\n\n  [[  6.67460269e-02   1.26228730e-02   0.00000000e+00   0.00000000e+00\n      1.49253636e-03   3.48752569e-03]\n   [  1.26228730e-02   2.38897188e-02   0.00000000e+00   0.00000000e+00\n      2.89165611e-03   1.03806824e-02]\n   [  0.00000000e+00   0.00000000e+00   2.36090454e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.36090454e-02\n      0.00000000e+00   0.00000000e+00]\n   [  1.49253636e-03   2.89165611e-03   0.00000000e+00   0.00000000e+00\n      2.44619671e-02   1.33296474e-02]\n   [  3.48752569e-03   1.03806824e-02   0.00000000e+00   0.00000000e+00\n      1.33296474e-02   2.45457394e-02]]]\n\n\n [[[  2.65420364e-01   4.99414571e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.26228730e-02]\n   [  4.99414571e-02   9.28601433e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   3.44386672e-02]\n   [  0.00000000e+00   0.00000000e+00   9.28803966e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   9.28803966e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      9.28803966e-02   4.23962450e-02]\n   [  1.26228730e-02   3.44386672e-02   0.00000000e+00   0.00000000e+00\n      4.23962450e-02   7.77132412e-02]]\n\n  [[  3.97726860e-01   9.28601433e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.38897188e-02]\n   [  9.28601433e-02   2.90562294e-01   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.12630635e-01]\n   [  0.00000000e+00   0.00000000e+00   2.90496975e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.90496975e-01\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      2.90496975e-01   1.44016166e-01]\n   [  2.38897188e-02   1.12630635e-01   0.00000000e+00   0.00000000e+00\n      1.44016166e-01   2.78154454e-01]]\n\n  [[  0.00000000e+00   0.00000000e+00   1.37882688e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   6.41843282e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  1.37882688e-02   6.41843282e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.30566993e-02]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.30566993e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.37882688e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   6.41843282e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  1.37882688e-02   6.41843282e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.30566993e-02]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.30566993e-02\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.37882688e-02   2.89165611e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      6.41843282e-02   3.30528301e-02]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  1.37882688e-02   6.41843282e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   5.05803326e-02]\n   [  2.89165611e-03   3.30528301e-02   0.00000000e+00   0.00000000e+00\n      5.05803326e-02   1.04756020e-01]]\n\n  [[  1.45977260e-01   3.44386672e-02   0.00000000e+00   0.00000000e+00\n      5.61064034e-03   1.03806824e-02]\n   [  3.44386672e-02   1.12630635e-01   0.00000000e+00   0.00000000e+00\n      3.30528301e-02   7.09163009e-02]\n   [  0.00000000e+00   0.00000000e+00   1.06969865e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.06969865e-01\n      0.00000000e+00   0.00000000e+00]\n   [  5.61064034e-03   3.30528301e-02   0.00000000e+00   0.00000000e+00\n      1.23834010e-01   9.95709532e-02]\n   [  1.03806824e-02   7.09163009e-02   0.00000000e+00   0.00000000e+00\n      9.95709532e-02   2.17355090e-01]]]\n\n\n [[[  0.00000000e+00   0.00000000e+00   8.98131923e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.37882688e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  8.98131923e-03   1.37882688e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.86733880e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   2.86733880e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   1.37882688e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   6.41843282e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  1.37882688e-02   6.41843282e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.30566993e-02]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.30566993e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  3.96639641e-01   9.28803966e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.36090454e-02]\n   [  9.28803966e-02   2.90496975e-01   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.06969865e-01]\n   [  0.00000000e+00   0.00000000e+00   3.12945510e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.79207231e-01\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      2.79207231e-01   1.34348349e-01]\n   [  2.36090454e-02   1.06969865e-01   0.00000000e+00   0.00000000e+00\n      1.34348349e-01   2.53941149e-01]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.68691394e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.68691394e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.68691394e-02   5.18541969e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.68691394e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   5.18541969e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   2.86733880e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.30566993e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  2.86733880e-03   1.30566993e-02   0.00000000e+00   0.00000000e+00\n      5.18541969e-03   5.28151702e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   5.18541969e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   5.28151702e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]]\n\n\n [[[  0.00000000e+00   0.00000000e+00   0.00000000e+00   8.98131923e-03\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.37882688e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  8.98131923e-03   1.37882688e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.86733880e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.86733880e-03\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.37882688e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   6.41843282e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  1.37882688e-02   6.41843282e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.30566993e-02]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.30566993e-02\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.68691394e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.68691394e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  3.96639641e-01   9.28803966e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.36090454e-02]\n   [  9.28803966e-02   2.90496975e-01   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.06969865e-01]\n   [  0.00000000e+00   0.00000000e+00   2.79207231e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   3.12945510e-01\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      2.79207231e-01   1.34348349e-01]\n   [  2.36090454e-02   1.06969865e-01   0.00000000e+00   0.00000000e+00\n      1.34348349e-01   2.53941149e-01]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.68691394e-02   5.18541969e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.68691394e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   5.18541969e-03\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.86733880e-03\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.30566993e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  2.86733880e-03   1.30566993e-02   0.00000000e+00   0.00000000e+00\n      5.18541969e-03   5.28151702e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   5.18541969e-03\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   5.28151702e-03\n      0.00000000e+00   0.00000000e+00]]]\n\n\n [[[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      8.98131923e-03   1.49253636e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.37882688e-02   5.61064034e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  8.98131923e-03   1.37882688e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   8.72195152e-03]\n   [  1.49253636e-03   5.61064034e-03   0.00000000e+00   0.00000000e+00\n      8.72195152e-03   1.47614365e-02]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.37882688e-02   2.89165611e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      6.41843282e-02   3.30528301e-02]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  1.37882688e-02   6.41843282e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   5.05803326e-02]\n   [  2.89165611e-03   3.30528301e-02   0.00000000e+00   0.00000000e+00\n      5.05803326e-02   1.04756020e-01]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.68691394e-02   5.18541969e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   1.68691394e-02   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   5.18541969e-03   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      1.68691394e-02   5.18541969e-03]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.68691394e-02\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   5.18541969e-03\n      0.00000000e+00   0.00000000e+00]]\n\n  [[  3.96639641e-01   9.28803966e-02   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   2.44619671e-02]\n   [  9.28803966e-02   2.90496975e-01   0.00000000e+00   0.00000000e+00\n      0.00000000e+00   1.23834010e-01]\n   [  0.00000000e+00   0.00000000e+00   2.79207231e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   2.79207231e-01\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00\n      3.12945510e-01   1.63177308e-01]\n   [  2.44619671e-02   1.23834010e-01   0.00000000e+00   0.00000000e+00\n      1.63177308e-01   3.26218201e-01]]\n\n  [[  1.77730867e-01   4.23962450e-02   0.00000000e+00   0.00000000e+00\n      8.72195152e-03   1.33296474e-02]\n   [  4.23962450e-02   1.44016166e-01   0.00000000e+00   0.00000000e+00\n      5.05803326e-02   9.95709532e-02]\n   [  0.00000000e+00   0.00000000e+00   1.34348349e-01   0.00000000e+00\n      0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.34348349e-01\n      0.00000000e+00   0.00000000e+00]\n   [  8.72195152e-03   5.05803326e-02   0.00000000e+00   0.00000000e+00\n      1.63177308e-01   1.41995363e-01]\n   [  1.33296474e-02   9.95709532e-02   0.00000000e+00   0.00000000e+00\n      1.41995363e-01   3.17406555e-01]]]]"
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "\n"
      },
      {
       "output_type": "pyout",
       "prompt_number": 35,
       "text": "[-3.1596039710068511,\n -7.8207331845299244,\n -7.8597189212209964,\n -7.8606098325514955,\n -7.860713927416132,\n -7.8607399825987567]"
      }
     ],
     "prompt_number": 35
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import molecule,h2o,basisset,rhf\nfrom pyquante2.ints.integrals import onee_integrals,twoe_integrals\nfrom pyquante2.utils import dmat,trace2,geigh\n\nbfs = basisset(h2o,'sto3g')\n\ni1 = onee_integrals(bfs,h2o)\ni2 = twoe_integrals(bfs)\nprint \"S = \\n\",i1.S\nprint \"h = \\n\",i1.T + i1.V\nprint \"I2 = \\n\",i2._2e_ints[:5]\ns = rhf(h2o,bfs)\ns.converge()",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "S = \n[[  1.00000000e+00   2.36703937e-01   0.00000000e+00   0.00000000e+00\n   -4.36556721e-18   5.58187997e-02   5.58187997e-02]\n [  2.36703937e-01   1.00000000e+00   0.00000000e+00   0.00000000e+00\n    0.00000000e+00   4.84136727e-01   4.84136727e-01]\n [  0.00000000e+00   0.00000000e+00   1.00000000e+00   0.00000000e+00\n    0.00000000e+00   3.18050818e-01  -3.18050818e-01]\n [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.00000000e+00\n    0.00000000e+00   0.00000000e+00   0.00000000e+00]\n [ -4.36556721e-18   0.00000000e+00   0.00000000e+00   0.00000000e+00\n    1.00000000e+00  -2.39805302e-01  -2.39805302e-01]\n [  5.58187997e-02   4.84136727e-01   3.18050818e-01   0.00000000e+00\n   -2.39805302e-01   1.00000000e+00   2.54589471e-01]\n [  5.58187997e-02   4.84136727e-01  -3.18050818e-01   0.00000000e+00\n   -2.39805302e-01   2.54589471e-01   1.00000000e+00]]\nh = \n[[ -3.27375212e+01  -7.61673524e+00   0.00000000e+00   0.00000000e+00\n    1.92565169e-02  -1.81003520e+00  -1.81003520e+00]\n [ -7.61673524e+00  -9.34981821e+00   0.00000000e+00   0.00000000e+00\n    2.25274817e-01  -3.83199371e+00  -3.83199371e+00]\n [  0.00000000e+00   0.00000000e+00  -7.63461683e+00   0.00000000e+00\n    0.00000000e+00  -2.08478101e+00   2.08478101e+00]\n [  0.00000000e+00   0.00000000e+00   0.00000000e+00  -7.46989864e+00\n    0.00000000e+00   0.00000000e+00   0.00000000e+00]\n [  1.92565169e-02   2.25274817e-01   0.00000000e+00   0.00000000e+00\n   -7.56353965e+00   1.64579197e+00   1.64579197e+00]\n [ -1.81003520e+00  -3.83199371e+00  -2.08478101e+00   0.00000000e+00\n    1.64579197e+00  -5.13311455e+00  -1.64478037e+00]\n [ -1.81003520e+00  -3.83199371e+00   2.08478101e+00   0.00000000e+00\n    1.64579197e+00  -1.64478037e+00  -5.13311455e+00]]\nI2 = \n[[[[  4.78506539e+00   7.41380350e-01   0.00000000e+00 ...,\n     -1.09317641e-17   1.77733105e-01   1.77733105e-01]\n   [  7.41380350e-01   1.11894686e+00   0.00000000e+00 ...,\n     -2.97941395e-18   4.13579000e-01   4.13579000e-01]\n   [  0.00000000e+00   0.00000000e+00   1.11581381e+00 ...,\n      0.00000000e+00   2.31295029e-01  -2.31295029e-01]\n   ..., \n   [ -1.09317641e-17  -2.97941395e-18   0.00000000e+00 ...,\n      1.11581381e+00  -1.74392806e-01  -1.74392806e-01]\n   [  1.77733105e-01   4.13579000e-01   2.31295029e-01 ...,\n     -1.74392806e-01   5.38762938e-01   1.64766439e-01]\n   [  1.77733105e-01   4.13579000e-01  -2.31295029e-01 ...,\n     -1.74392806e-01   1.64766439e-01   5.38762938e-01]]\n\n  [[  7.41380350e-01   1.36873385e-01   0.00000000e+00 ...,\n     -3.29465902e-18   3.25165492e-02   3.25165492e-02]\n   [  1.36873385e-01   2.56633394e-01   0.00000000e+00 ...,\n     -5.73294162e-19   9.59611007e-02   9.59611007e-02]\n   [  0.00000000e+00   0.00000000e+00   2.56683985e-01 ...,\n      0.00000000e+00   5.43844411e-02  -5.43844411e-02]\n   ..., \n   [ -3.29465902e-18  -5.73294162e-19   0.00000000e+00 ...,\n      2.56683985e-01  -4.10050112e-02  -4.10050112e-02]\n   [  3.25165492e-02   9.59611007e-02   5.43844411e-02 ...,\n     -4.10050112e-02   1.27038426e-01   3.85534447e-02]\n   [  3.25165492e-02   9.59611007e-02  -5.43844411e-02 ...,\n     -4.10050112e-02   3.85534447e-02   1.27038426e-01]]\n\n  [[  0.00000000e+00   0.00000000e+00   2.44774121e-02 ...,\n      0.00000000e+00   1.19158318e-03  -1.19158318e-03]\n   [  0.00000000e+00   0.00000000e+00   3.78086072e-02 ...,\n      0.00000000e+00   5.72000216e-03  -5.72000216e-03]\n   [  2.44774121e-02   3.78086072e-02   0.00000000e+00 ...,\n     -3.36278574e-19   1.31229075e-02   1.31229075e-02]\n   ..., \n   [  0.00000000e+00   0.00000000e+00  -3.36278574e-19 ...,\n      0.00000000e+00  -2.15397470e-03   2.15397470e-03]\n   [  1.19158318e-03   5.72000216e-03   1.31229075e-02 ...,\n     -2.15397470e-03   1.02011735e-02   6.77626358e-21]\n   [ -1.19158318e-03  -5.72000216e-03   1.31229075e-02 ...,\n      2.15397470e-03   6.77626358e-21  -1.02011735e-02]]\n\n  ..., \n  [[ -1.09317641e-17  -3.29465902e-18   0.00000000e+00 ...,\n      2.44774121e-02  -8.98434932e-04  -8.98434932e-04]\n   [ -3.29465902e-18  -5.19621701e-18   0.00000000e+00 ...,\n      3.78086072e-02  -4.31279145e-03  -4.31279145e-03]\n   [  0.00000000e+00   0.00000000e+00  -5.22260861e-18 ...,\n      0.00000000e+00  -2.15397470e-03   2.15397470e-03]\n   ..., \n   [  2.44774121e-02   3.78086072e-02   0.00000000e+00 ...,\n     -5.89516576e-18   1.18901803e-02   1.18901803e-02]\n   [ -8.98434932e-04  -4.31279145e-03  -2.15397470e-03 ...,\n      1.18901803e-02  -7.69152401e-03  -2.77201102e-03]\n   [ -8.98434932e-04  -4.31279145e-03   2.15397470e-03 ...,\n      1.18901803e-02  -2.77201102e-03  -7.69152401e-03]]\n\n  [[  1.77733105e-01   3.25165492e-02   1.19158318e-03 ...,\n     -8.98434932e-04   7.82466264e-03   7.70178443e-03]\n   [  3.25165492e-02   6.05107138e-02   2.22268203e-03 ...,\n     -1.67586721e-03   2.32041931e-02   2.24675658e-02]\n   [  1.19158318e-03   2.22268203e-03   6.06194552e-02 ...,\n     -1.67895211e-04   1.37576874e-02  -1.21261199e-02]\n   ..., \n   [ -8.98434932e-04  -1.67586721e-03  -1.67895211e-04 ...,\n      6.05233682e-02  -1.03730794e-02  -1.00494912e-02]\n   [  7.82466264e-03   2.32041931e-02   1.37576874e-02 ...,\n     -1.03730794e-02   3.10267308e-02   9.22400692e-03]\n   [  7.70178443e-03   2.24675658e-02  -1.21261199e-02 ...,\n     -1.00494912e-02   9.22400692e-03   2.96592475e-02]]\n\n  [[  1.77733105e-01   3.25165492e-02  -1.19158318e-03 ...,\n     -8.98434932e-04   7.70178443e-03   7.82466264e-03]\n   [  3.25165492e-02   6.05107138e-02  -2.22268203e-03 ...,\n     -1.67586721e-03   2.24675658e-02   2.32041931e-02]\n   [ -1.19158318e-03  -2.22268203e-03   6.06194552e-02 ...,\n      1.67895211e-04   1.21261199e-02  -1.37576874e-02]\n   ..., \n   [ -8.98434932e-04  -1.67586721e-03   1.67895211e-04 ...,\n      6.05233682e-02  -1.00494912e-02  -1.03730794e-02]\n   [  7.70178443e-03   2.24675658e-02   1.21261199e-02 ...,\n     -1.00494912e-02   2.96592475e-02   9.22400692e-03]\n   [  7.82466264e-03   2.32041931e-02  -1.37576874e-02 ...,\n     -1.03730794e-02   9.22400692e-03   3.10267308e-02]]]\n\n\n [[[  7.41380350e-01   1.36873385e-01   0.00000000e+00 ...,\n     -3.29465902e-18   3.25165492e-02   3.25165492e-02]\n   [  1.36873385e-01   2.56633394e-01   0.00000000e+00 ...,\n     -5.73294162e-19   9.59611007e-02   9.59611007e-02]\n   [  0.00000000e+00   0.00000000e+00   2.56683985e-01 ...,\n      0.00000000e+00   5.43844411e-02  -5.43844411e-02]\n   ..., \n   [ -3.29465902e-18  -5.73294162e-19   0.00000000e+00 ...,\n      2.56683985e-01  -4.10050112e-02  -4.10050112e-02]\n   [  3.25165492e-02   9.59611007e-02   5.43844411e-02 ...,\n     -4.10050112e-02   1.27038426e-01   3.85534447e-02]\n   [  3.25165492e-02   9.59611007e-02  -5.43844411e-02 ...,\n     -4.10050112e-02   3.85534447e-02   1.27038426e-01]]\n\n  [[  1.11894686e+00   2.56633394e-01   0.00000000e+00 ...,\n     -5.19621701e-18   6.05107138e-02   6.05107138e-02]\n   [  2.56633394e-01   8.17206319e-01   0.00000000e+00 ...,\n     -2.38435084e-18   3.36126862e-01   3.36126862e-01]\n   [  0.00000000e+00   0.00000000e+00   8.17022603e-01 ...,\n      0.00000000e+00   2.03480113e-01  -2.03480113e-01]\n   ..., \n   [ -5.19621701e-18  -2.38435084e-18   0.00000000e+00 ...,\n      8.17022603e-01  -1.53420797e-01  -1.53420797e-01]\n   [  6.05107138e-02   3.36126862e-01   2.03480113e-01 ...,\n     -1.53420797e-01   5.08392632e-01   1.45628156e-01]\n   [  6.05107138e-02   3.36126862e-01  -2.03480113e-01 ...,\n     -1.53420797e-01   1.45628156e-01   5.08392632e-01]]\n\n  [[  0.00000000e+00   0.00000000e+00   3.78086072e-02 ...,\n      0.00000000e+00   2.22268203e-03  -2.22268203e-03]\n   [  0.00000000e+00   0.00000000e+00   1.80518391e-01 ...,\n      0.00000000e+00   4.28953693e-02  -4.28953693e-02]\n   [  3.78086072e-02   1.80518391e-01   0.00000000e+00 ...,\n     -4.78751979e-19   8.36883904e-02   8.36883904e-02]\n   ..., \n   [  0.00000000e+00   0.00000000e+00  -4.78751979e-19 ...,\n      0.00000000e+00  -1.86629967e-02   1.86629967e-02]\n   [  2.22268203e-03   4.28953693e-02   8.36883904e-02 ...,\n     -1.86629967e-02   1.03864238e-01  -4.33680869e-19]\n   [ -2.22268203e-03  -4.28953693e-02   8.36883904e-02 ...,\n      1.86629967e-02  -4.33680869e-19  -1.03864238e-01]]\n\n  ..., \n  [[ -2.97941395e-18  -5.73294162e-19   0.00000000e+00 ...,\n      3.78086072e-02  -1.67586721e-03  -1.67586721e-03]\n   [ -5.73294162e-19  -2.38435084e-18   0.00000000e+00 ...,\n      1.80518391e-01  -3.23424322e-02  -3.23424322e-02]\n   [  0.00000000e+00   0.00000000e+00  -1.21542565e-18 ...,\n      0.00000000e+00  -1.86629967e-02   1.86629967e-02]\n   ..., \n   [  3.78086072e-02   1.80518391e-01   0.00000000e+00 ...,\n     -2.17292961e-18   7.30074931e-02   7.30074931e-02]\n   [ -1.67586721e-03  -3.23424322e-02  -1.86629967e-02 ...,\n      7.30074931e-02  -7.83119979e-02  -2.43052691e-02]\n   [ -1.67586721e-03  -3.23424322e-02   1.86629967e-02 ...,\n      7.30074931e-02  -2.43052691e-02  -7.83119979e-02]]\n\n  [[  4.13579000e-01   9.59611007e-02   5.72000216e-03 ...,\n     -4.31279145e-03   2.32041931e-02   2.24675658e-02]\n   [  9.59611007e-02   3.36126862e-01   4.28953693e-02 ...,\n     -3.23424322e-02   1.68271813e-01   1.37634766e-01]\n   [  5.72000216e-03   4.28953693e-02   3.40989193e-01 ...,\n     -7.84754695e-03   1.23734852e-01  -6.94473081e-02]\n   ..., \n   [ -4.31279145e-03  -3.23424322e-02  -7.84754695e-03 ...,\n      3.36498015e-01  -9.32941280e-02  -7.42124336e-02]\n   [  2.32041931e-02   1.68271813e-01   1.23734852e-01 ...,\n     -9.32941280e-02   3.14059122e-01   7.16787171e-02]\n   [  2.24675658e-02   1.37634766e-01  -6.94473081e-02 ...,\n     -7.42124336e-02   7.16787171e-02   2.12655417e-01]]\n\n  [[  4.13579000e-01   9.59611007e-02  -5.72000216e-03 ...,\n     -4.31279145e-03   2.24675658e-02   2.32041931e-02]\n   [  9.59611007e-02   3.36126862e-01  -4.28953693e-02 ...,\n     -3.23424322e-02   1.37634766e-01   1.68271813e-01]\n   [ -5.72000216e-03  -4.28953693e-02   3.40989193e-01 ...,\n      7.84754695e-03   6.94473081e-02  -1.23734852e-01]\n   ..., \n   [ -4.31279145e-03  -3.23424322e-02   7.84754695e-03 ...,\n      3.36498015e-01  -7.42124336e-02  -9.32941280e-02]\n   [  2.24675658e-02   1.37634766e-01   6.94473081e-02 ...,\n     -7.42124336e-02   2.12655417e-01   7.16787171e-02]\n   [  2.32041931e-02   1.68271813e-01  -1.23734852e-01 ...,\n     -9.32941280e-02   7.16787171e-02   3.14059122e-01]]]\n\n\n [[[  0.00000000e+00   0.00000000e+00   2.44774121e-02 ...,\n      0.00000000e+00   1.19158318e-03  -1.19158318e-03]\n   [  0.00000000e+00   0.00000000e+00   3.78086072e-02 ...,\n      0.00000000e+00   5.72000216e-03  -5.72000216e-03]\n   [  2.44774121e-02   3.78086072e-02   0.00000000e+00 ...,\n     -3.36278574e-19   1.31229075e-02   1.31229075e-02]\n   ..., \n   [  0.00000000e+00   0.00000000e+00  -3.36278574e-19 ...,\n      0.00000000e+00  -2.15397470e-03   2.15397470e-03]\n   [  1.19158318e-03   5.72000216e-03   1.31229075e-02 ...,\n     -2.15397470e-03   1.02011735e-02   6.77626358e-21]\n   [ -1.19158318e-03  -5.72000216e-03   1.31229075e-02 ...,\n      2.15397470e-03   6.77626358e-21  -1.02011735e-02]]\n\n  [[  0.00000000e+00   0.00000000e+00   3.78086072e-02 ...,\n      0.00000000e+00   2.22268203e-03  -2.22268203e-03]\n   [  0.00000000e+00   0.00000000e+00   1.80518391e-01 ...,\n      0.00000000e+00   4.28953693e-02  -4.28953693e-02]\n   [  3.78086072e-02   1.80518391e-01   0.00000000e+00 ...,\n     -4.78751979e-19   8.36883904e-02   8.36883904e-02]\n   ..., \n   [  0.00000000e+00   0.00000000e+00  -4.78751979e-19 ...,\n      0.00000000e+00  -1.86629967e-02   1.86629967e-02]\n   [  2.22268203e-03   4.28953693e-02   8.36883904e-02 ...,\n     -1.86629967e-02   1.03864238e-01  -4.33680869e-19]\n   [ -2.22268203e-03  -4.28953693e-02   8.36883904e-02 ...,\n      1.86629967e-02  -4.33680869e-19  -1.03864238e-01]]\n\n  [[  1.11581381e+00   2.56683985e-01   0.00000000e+00 ...,\n     -5.22260861e-18   6.06194552e-02   6.06194552e-02]\n   [  2.56683985e-01   8.17022603e-01   0.00000000e+00 ...,\n     -1.21542565e-18   3.40989193e-01   3.40989193e-01]\n   [  0.00000000e+00   0.00000000e+00   8.80159091e-01 ...,\n      0.00000000e+00   2.18379651e-01  -2.18379651e-01]\n   ..., \n   [ -5.22260861e-18  -1.21542565e-18   0.00000000e+00 ...,\n      7.85270201e-01  -1.51065162e-01  -1.51065162e-01]\n   [  6.06194552e-02   3.40989193e-01   2.18379651e-01 ...,\n     -1.51065162e-01   5.26915942e-01   1.45284425e-01]\n   [  6.06194552e-02   3.40989193e-01  -2.18379651e-01 ...,\n     -1.51065162e-01   1.45284425e-01   5.26915942e-01]]\n\n  ..., \n  [[  0.00000000e+00   0.00000000e+00  -3.36278574e-19 ...,\n      0.00000000e+00  -1.67895211e-04   1.67895211e-04]\n   [  0.00000000e+00   0.00000000e+00  -4.78751979e-19 ...,\n      0.00000000e+00  -7.84754695e-03   7.84754695e-03]\n   [ -3.36278574e-19  -4.78751979e-19   0.00000000e+00 ...,\n      4.74444448e-02  -1.14686513e-02  -1.14686513e-02]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   4.74444448e-02 ...,\n      0.00000000e+00   1.25358845e-02  -1.25358845e-02]\n   [ -1.67895211e-04  -7.84754695e-03  -1.14686513e-02 ...,\n      1.25358845e-02  -2.95928282e-02  -1.08420217e-19]\n   [  1.67895211e-04   7.84754695e-03  -1.14686513e-02 ...,\n     -1.25358845e-02  -1.08420217e-19   2.95928282e-02]]\n\n  [[  2.31295029e-01   5.43844411e-02   1.31229075e-02 ...,\n     -2.15397470e-03   1.37576874e-02   1.21261199e-02]\n   [  5.43844411e-02   2.03480113e-01   8.36883904e-02 ...,\n     -1.86629967e-02   1.23734852e-01   6.94473081e-02]\n   [  1.31229075e-02   8.36883904e-02   2.18379651e-01 ...,\n     -1.14686513e-02   1.14555834e-01  -1.59980511e-02]\n   ..., \n   [ -2.15397470e-03  -1.86629967e-02  -1.14686513e-02 ...,\n      1.97681017e-01  -6.78492639e-02  -3.65604761e-02]\n   [  1.37576874e-02   1.23734852e-01   1.14555834e-01 ...,\n     -6.78492639e-02   2.63890558e-01   4.53601710e-02]\n   [  1.21261199e-02   6.94473081e-02  -1.59980511e-02 ...,\n     -3.65604761e-02   4.53601710e-02   9.39252241e-02]]\n\n  [[ -2.31295029e-01  -5.43844411e-02   1.31229075e-02 ...,\n      2.15397470e-03  -1.21261199e-02  -1.37576874e-02]\n   [ -5.43844411e-02  -2.03480113e-01   8.36883904e-02 ...,\n      1.86629967e-02  -6.94473081e-02  -1.23734852e-01]\n   [  1.31229075e-02   8.36883904e-02  -2.18379651e-01 ...,\n     -1.14686513e-02  -1.59980511e-02   1.14555834e-01]\n   ..., \n   [  2.15397470e-03   1.86629967e-02  -1.14686513e-02 ...,\n     -1.97681017e-01   3.65604761e-02   6.78492639e-02]\n   [ -1.21261199e-02  -6.94473081e-02  -1.59980511e-02 ...,\n      3.65604761e-02  -9.39252241e-02  -4.53601710e-02]\n   [ -1.37576874e-02  -1.23734852e-01   1.14555834e-01 ...,\n      6.78492639e-02  -4.53601710e-02  -2.63890558e-01]]]\n\n\n [[[  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]]\n\n  ..., \n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]]\n\n  [[  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]\n   [  0.00000000e+00   0.00000000e+00   0.00000000e+00 ...,\n      0.00000000e+00   0.00000000e+00   0.00000000e+00]]]\n\n\n [[[ -1.09317641e-17  -3.29465902e-18   0.00000000e+00 ...,\n      2.44774121e-02  -8.98434932e-04  -8.98434932e-04]\n   [ -3.29465902e-18  -5.19621701e-18   0.00000000e+00 ...,\n      3.78086072e-02  -4.31279145e-03  -4.31279145e-03]\n   [  0.00000000e+00   0.00000000e+00  -5.22260861e-18 ...,\n      0.00000000e+00  -2.15397470e-03   2.15397470e-03]\n   ..., \n   [  2.44774121e-02   3.78086072e-02   0.00000000e+00 ...,\n     -5.89516576e-18   1.18901803e-02   1.18901803e-02]\n   [ -8.98434932e-04  -4.31279145e-03  -2.15397470e-03 ...,\n      1.18901803e-02  -7.69152401e-03  -2.77201102e-03]\n   [ -8.98434932e-04  -4.31279145e-03   2.15397470e-03 ...,\n      1.18901803e-02  -2.77201102e-03  -7.69152401e-03]]\n\n  [[ -2.97941395e-18  -5.73294162e-19   0.00000000e+00 ...,\n      3.78086072e-02  -1.67586721e-03  -1.67586721e-03]\n   [ -5.73294162e-19  -2.38435084e-18   0.00000000e+00 ...,\n      1.80518391e-01  -3.23424322e-02  -3.23424322e-02]\n   [  0.00000000e+00   0.00000000e+00  -1.21542565e-18 ...,\n      0.00000000e+00  -1.86629967e-02   1.86629967e-02]\n   ..., \n   [  3.78086072e-02   1.80518391e-01   0.00000000e+00 ...,\n     -2.17292961e-18   7.30074931e-02   7.30074931e-02]\n   [ -1.67586721e-03  -3.23424322e-02  -1.86629967e-02 ...,\n      7.30074931e-02  -7.83119979e-02  -2.43052691e-02]\n   [ -1.67586721e-03  -3.23424322e-02   1.86629967e-02 ...,\n      7.30074931e-02  -2.43052691e-02  -7.83119979e-02]]\n\n  [[  0.00000000e+00   0.00000000e+00  -3.36278574e-19 ...,\n      0.00000000e+00  -1.67895211e-04   1.67895211e-04]\n   [  0.00000000e+00   0.00000000e+00  -4.78751979e-19 ...,\n      0.00000000e+00  -7.84754695e-03   7.84754695e-03]\n   [ -3.36278574e-19  -4.78751979e-19   0.00000000e+00 ...,\n      4.74444448e-02  -1.14686513e-02  -1.14686513e-02]\n   ..., \n   [  0.00000000e+00   0.00000000e+00   4.74444448e-02 ...,\n      0.00000000e+00   1.25358845e-02  -1.25358845e-02]\n   [ -1.67895211e-04  -7.84754695e-03  -1.14686513e-02 ...,\n      1.25358845e-02  -2.95928282e-02  -1.08420217e-19]\n   [  1.67895211e-04   7.84754695e-03  -1.14686513e-02 ...,\n     -1.25358845e-02  -1.08420217e-19   2.95928282e-02]]\n\n  ..., \n  [[  1.11581381e+00   2.56683985e-01   0.00000000e+00 ...,\n     -5.89516576e-18   6.05233682e-02   6.05233682e-02]\n   [  2.56683985e-01   8.17022603e-01   0.00000000e+00 ...,\n     -2.17292961e-18   3.36498015e-01   3.36498015e-01]\n   [  0.00000000e+00   0.00000000e+00   7.85270201e-01 ...,\n      0.00000000e+00   1.97681017e-01  -1.97681017e-01]\n   ..., \n   [ -5.89516576e-18  -2.17292961e-18   0.00000000e+00 ...,\n      8.80159091e-01  -1.62638022e-01  -1.62638022e-01]\n   [  6.05233682e-02   3.36498015e-01   1.97681017e-01 ...,\n     -1.62638022e-01   5.09979865e-01   1.49079118e-01]\n   [  6.05233682e-02   3.36498015e-01  -1.97681017e-01 ...,\n     -1.62638022e-01   1.49079118e-01   5.09979865e-01]]\n\n  [[ -1.74392806e-01  -4.10050112e-02  -2.15397470e-03 ...,\n      1.18901803e-02  -1.03730794e-02  -1.00494912e-02]\n   [ -4.10050112e-02  -1.53420797e-01  -1.86629967e-02 ...,\n      7.30074931e-02  -9.32941280e-02  -7.42124336e-02]\n   [ -2.15397470e-03  -1.86629967e-02  -1.51065162e-01 ...,\n      1.25358845e-02  -6.78492639e-02   3.65604761e-02]\n   ..., \n   [  1.18901803e-02   7.30074931e-02   1.25358845e-02 ...,\n     -1.62638022e-01   7.57254664e-02   5.88677920e-02]\n   [ -1.03730794e-02  -9.32941280e-02  -6.78492639e-02 ...,\n      7.57254664e-02  -1.98969320e-01  -4.46735990e-02]\n   [ -1.00494912e-02  -7.42124336e-02   3.65604761e-02 ...,\n      5.88677920e-02  -4.46735990e-02  -1.25906109e-01]]\n\n  [[ -1.74392806e-01  -4.10050112e-02   2.15397470e-03 ...,\n      1.18901803e-02  -1.00494912e-02  -1.03730794e-02]\n   [ -4.10050112e-02  -1.53420797e-01   1.86629967e-02 ...,\n      7.30074931e-02  -7.42124336e-02  -9.32941280e-02]\n   [  2.15397470e-03   1.86629967e-02  -1.51065162e-01 ...,\n     -1.25358845e-02  -3.65604761e-02   6.78492639e-02]\n   ..., \n   [  1.18901803e-02   7.30074931e-02  -1.25358845e-02 ...,\n     -1.62638022e-01   5.88677920e-02   7.57254664e-02]\n   [ -1.00494912e-02  -7.42124336e-02  -3.65604761e-02 ...,\n      5.88677920e-02  -1.25906109e-01  -4.46735990e-02]\n   [ -1.03730794e-02  -9.32941280e-02   6.78492639e-02 ...,\n      7.57254664e-02  -4.46735990e-02  -1.98969320e-01]]]]"
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "\n"
      },
      {
       "output_type": "pyout",
       "prompt_number": 36,
       "text": "[-65.138374025697487,\n -74.467494698388464,\n -74.958013783771676,\n -74.959757388633875,\n -74.959839790498989,\n -74.959853191419228]"
      }
     ],
     "prompt_number": 36
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import h2o,basisset,rhf\nfrom pyquante2.utils import dmat\nfrom pyquante2.ints.integrals import twoe_integrals,twoe_integrals_compressed\nbfs = basisset(h2o,'sto3g')\nsolver = rhf(h2o,bfs)\nsolver.converge()\nD = dmat(solver.orbs,h2o.nocc())\ni2 = twoe_integrals(bfs)\ni2c = twoe_integrals_compressed(bfs)",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 37
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit twoe_integrals(bfs)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "10 loops, best of 3: 193 ms per loop\n"
      }
     ],
     "prompt_number": 38
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit twoe_integrals_compressed(bfs)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "10 loops, best of 3: 182 ms per loop\n"
      }
     ],
     "prompt_number": 39
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit i2.get_j(D)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "100000 loops, best of 3: 10.1 us per loop\n"
      }
     ],
     "prompt_number": 40
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "%timeit i2c.get_j(D)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "100 loops, best of 3: 4.86 ms per loop\n"
      }
     ],
     "prompt_number": 41
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "(i2.get_j(D)-i2c.get_j(D)).max()",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 42,
       "text": "2.2204460492503131e-16"
      }
     ],
     "prompt_number": "*"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "There are several significant results here:\n\n* The uncompressed integrals don't take any longer\n* The get_j() function is much faster.\n* The uncompressed ones are now"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from pyquante2 import h2o,basisset,rhf\nfrom pyquante2.utils import dmat\nfrom pyquante2.ints.integrals import twoe_integrals,twoe_integrals_compressed\nbfs = basisset(h2o,'6-31g**')\nsolver = rhf(h2o,bfs)\nsolver.converge()\nD = dmat(solver.orbs,h2o.nocc())\ni2 = twoe_integrals(bfs)\ni2c = twoe_integrals_compressed(bfs)",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": "*"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": "*"
    }
   ],
   "metadata": {}
  }
 ]
}